-
Notifications
You must be signed in to change notification settings - Fork 448
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add functions to support Standard Swizzle textures #515
base: main
Are you sure you want to change the base?
Conversation
@microsoft-github-policy-service agree company="Microsoft" |
DirectXTex/DirectXTexImage.cpp
Outdated
_Use_decl_annotations_ | ||
HRESULT ScratchImage::InitializeImagesFromSwizzles(const Image* srcImage, size_t nImages, CP_FLAGS flags) noexcept | ||
{ | ||
HRESULT hr = Initialize2D(srcImage[0].format, srcImage[0].width, srcImage[0].height, nImages, 1, flags); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This only works for 2D arrays without mipmaps. For some example of more general scenarios (mips, arrays with mips, volumes, volumes with mips) see TransformImage
in DirectXTexMisc.cpp
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Looked at TransformImage in DirectXTexMisc.cpp. I only saw mips being used in the 3d case. And even in that one, we're kind of just iterating for index = 0; index < nImages.
In the case: array of 2d images, we're iterating through each image independantley. So I don't think there's anything new to do there?
In the 3d case. I should separate slice (which is being swizzled) and layer( which is not being swizzled). But what order is the array of srcImages? layerMajor or sliceMajor?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
For the 3D case, my understanding is you would do:
size_t width = mdata.width;
size_t height = mdata.height;
size_t depth = mdata.depth;
for (size_t level = 0; level < mdata.mipLevels; ++level)
{
auto destPtrBase = result.GetImage(level, 0, 0); // All slices of a given depth are always continuous in ScratchImage.
for(size_t z = 0; z < depth; ++z)
{
auto srcImage = result.GetImage(level, 0, z);
for(size_t h = 0; h < height; ++h)
{
for(size_t x = 0; 0 < width; ++w)
{
// swizzle using x, y, z copying from srcImage to destPtrBase + swizzleIndex
}
}
}
if (height > 1)
height >>= 1;
if (width > 1)
width >>= 1;
if (depth > 1)
depth >>= 1;
}
Note for testing, I'll add coverage to the test suite which will likely just do a swizzle and deswizzle and make sure the bits match. As for determining if the swizzle is correct, I probably need to make a test app that renders using WARP which supports standard swizzle. |
13baea9
to
09ff9e8
Compare
- needs to be tested. where to get dx12 boilerplate? test just that texute still looks correct, or also test performance improves when roteated? - maybe merge functions? would then pass a boolean/enum to determine rowToSwizzle versus swizzleToRow Added functions that converts pixel order from row major to standard swizzle and from standard swizzle to row major. Functions for both 1 Image, and an array of Images. Folwoing standard DirectXTex pattern: Uses Image and TexMetadata as input. Outputs/initializes a ScratchImage.
Added new file to .vcxproj, other.vcxproj, and Cmake Merged to/from functions togeather memcpy src is const added non-AVX2 deposit_bits
TODO what flags/threshold to use to re-Compress?
More code review
Rework 2D swizzle into templates
Code review
Linux filesystem is case sensitive
09ff9e8
to
68b9cc7
Compare
Implement z-order curve "swizzling" for 2D and 3D textures to support the pixel order used for "Standard Swizzle" as defined by
D3D12_TEXTURE_LAYOUT_64KB_STANDARD_SWIZZLE
.